

"""

1. 类
    class后面紧接着是类名，Person，类名通常是大写开头的单词，紧接着是(object)，表示该类是从哪个类继承下来的

    构造方法的名称是：
        __init__，注意init前后的2个下划线符号

    类的私有属性
        __private_attrs： 两个下划线开头，声明该属性为私有，不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
    类的私有方法
        __private_method：两个下划线开头，声明该方法为私有方法，不能在类的外部调用。在类的内部调用 self.__private_methods
    类变量：
        empCount 变量是一个类变量，它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Person.empCount 访问

    self：
        代表类的实例，self 在定义类的方法时是必须有的，虽然在调用时不必传入相应的参数

    Python内置类属性：
        __dict__ : 类的属性（包含一个字典，由类的数据属性组成）
        __doc__ :类的文档字符串
        __name__: 类名
        __module__: 类定义所在的模块（类的全名是'__main__.className'，如果类位于一个导入模块mymod中，那么className.__module__ 等于 mymod）
        __bases__ : 类的所有父类构成元素（包含了一个由所有父类组成的元组）

    python对象销毁(垃圾回收)
        Python 使用了引用计数这一简单技术来跟踪和回收垃圾。
        在 Python 内部记录着所有使用中的对象各有多少引用。
        一个内部跟踪变量，称为一个引用计数器。
        当对象被创建时， 就创建了一个引用计数， 当这个对象不再需要时， 也就是说， 这个对象的引用计数变为0 时， 它被垃圾回收。但是回收不是"立即"的， 由解释器在适当的时机，将垃圾对象占用的内存空间回收

    单下划线、双下划线、头尾双下划线说明：
        __foo__: 定义的是特殊方法，一般是系统定义名字 ，类似 __init__() 之类的。
        _foo: 以单下划线开头的表示的是 protected 类型的变量，即保护类型只能允许其本身与子类进行访问，不能用于 from module import *
        __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了

"""

class Person:
    empCount = 0
    def __init__(self, name):
        self.name = name

    def run(self):
        print("run---")


Person.empCount = 1


'''
    class 派生类名(基类名)
        ...
    
    class SubClassName (ParentClass1[, ParentClass2, ...]):
        ...

    issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类，语法：issubclass(sub,sup)
    isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。


    在python中继承中的一些特点：
    
        1、如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法，或者不重写父类的构造方法。详细说明可查看： python 子类继承父类构造函数说明。
        2、在调用基类的方法时，需要加上基类的类名前缀，且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
        3、Python 总是首先查找对应类型的方法，如果它不能在派生类中找到对应的方法，它才开始到基类中逐个查找。（先在本类中查找调用的方法，找不到才去基类中找）。
    
    
'''

# 继承
class Student(Person):
    def __init__(self, name, score):
        super().__init__(name)
        self.score = score

        # 定义属性
        self.height = 176

    def run(self):
        print("student run---")



stu1 = Student('lisi', 66)
stu1.name = 'zhangsan'
stu1.run()